package com.powernode.ssm.springAnalysis.a12;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyDemo {

    interface Foo {
        void foo();
    }

    static final class Target implements Foo {
        public void foo() {
            System.out.println("target foo");
        }
    }

    // jdk 只能针对接口代理
    // 代理是 和 目标是平级，都是Foo接口的实现类
    public static void main(String[] param) throws IOException {
        Target target = new Target();

        /**
         * 为什么需要一个classloader？
         * 正常的java文件->编译成class文件->类加载器加载
         * jdk生成的代理类，无源码(即java文件)，运行期间直接生成class文件，因此需要一个类加载器加载class文件
         */
        ClassLoader classLoader = JdkProxyDemo.class.getClassLoader();
        Foo foo = (Foo) Proxy.newProxyInstance(classLoader, new Class[]{Foo.class}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("组装前运行...");
                Object invoke = method.invoke(target, args);
                System.out.println("组装后运行...");
                return invoke;
            }
        });
        foo.foo();
    }
}